package com.grand.ch08;

public class ArrayAlg {
    public static Pair<String> minmax(String[] a){
        if(a == null || a.length == 0) return null;
        String min = a[0];
        String max = a[0];
        for (int i = 0; i < a.length ; i++) {
            if(min.compareTo(a[i]) > 0) min = a[i];
            if(max.compareTo(a[i]) < 0) max = a[i];
        }
        return new Pair<>(min,max);
    }


    /*
    * 定义一个泛型方法，这个方法可以再普通类中定义，也可以再泛型类中定义
    * */
    public static <T> T getMiddle(T... a){
        return a[a.length / 2];
    }


    /*
    * 类型变量的限定
    * 将T强制设定了集成Comparable接口，这样就可以使用compareTo方法。
    * 这里extends可能会疑惑，Comparable虽然是一个接口，但是也需要使用extends关键字。
    * 一个类型变量或者通配符可以有多个限定，例如 T extends Comparable & Serializable,限定符使用 & 符号来分隔
    * 但是限定中最多一个类 ，如果一个类作为限定，他必须是限定列表中的第一个
    * */
    public static <T extends Comparable>T min(T[] a){
        if(a==null || a.length ==0) return null;
        T small = a[0];
        for(int i=1; i<a.length; i++){
            if(small.compareTo(a[i]) > 0) small = a[i];
        }
        return small;
    }





    public static void main(String[] args) {
        String[] a = {"abc","bcd","efg"};
        /*
        * 在调用的时候，最好是指定泛型类型，当然也可以不指定，让系统自己去判断
        * */
        String middle = ArrayAlg.<String>getMiddle(a);
        System.out.println(middle);
    }


}
